/*!
    \file    main.c
    \brief   EXTI 按键中断演示

    \version 2025-08-08, V1.1.0, 适用于 gd32c2x1 的固件
*/


/*
    版权所有 (c) 2025, GigaDevice Semiconductor Inc.

    允许以源代码和二进制形式重新分发和使用，无论是否经过修改，
只要符合以下条件：

    1. 源代码的再分发必须保留上述版权声明、本条件列表和以下免责声明。
    2. 二进制形式的再分发必须在随发行提供的文档和/或其他材料中复制上述版权声明、
       本条件列表和以下免责声明。
    3. 未经事先书面许可，不得使用版权持有者或其贡献者的名称为本软件派生的产品做推广、
       认可或宣传。

    本软件由版权持有者和贡献者按“原样”提供，不提供任何明示或暗示的担保，
包括但不限于对适销性和特定用途适用性的暗示担保。
无论在任何情况下，版权持有者或贡献者均不对因使用本软件而引起的任何直接、
间接、偶然、特殊、惩罚性或后果性损害（包括但不限于采购替代商品或服务；
使用损失、数据丢失或利润损失；业务中断），无论是在合同诉讼、严格责任或侵权（包括疏忽或其他原因）
中产生的，即使已被告知发生此类损害的可能性，也不承担任何责任。
*/

#include "gd32c2x1.h"
#include "systick.h"

static void led_flash(uint8_t times);

/*!
    \brief      主函数
    \param[in]  无
    \param[out] 无
    \retval     无
*/
    \brief      main function
    \param[in]  none
    \param[out] none
    \retval     none
*/
int main(void)
{
    systick_config();

    /* 使能 LED2 GPIO 时钟 */
    rcu_periph_clock_enable(RCU_GPIOD);
    /* 配置 LED2 GPIO 端口 */
    gpio_mode_set(GPIOD, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_1);
    gpio_output_options_set(GPIOD, GPIO_OTYPE_PP, GPIO_OSPEED_LEVEL_1, GPIO_PIN_1);
    /* 复位 LED2 GPIO 引脚 */
    gpio_bit_reset(GPIOD, GPIO_PIN_1);

    /* 测试闪烁 LED */
    led_flash(1);

    /* 使能用户按键 GPIO 时钟 */
    rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_SYSCFG);

    /* 配置按键引脚为输入 */
    gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_4);

    /* 使能并设置按键 EXTI 中断优先级 */
    nvic_irq_enable(EXTI4_IRQn, 2U);
    /* 连接按键 EXTI 线到按键 GPIO 引脚 */
    syscfg_exti_line_config(EXTI_SOURCE_GPIOA, EXTI_SOURCE_PIN4);
    /* 配置按键 EXTI 线 */
    exti_init(EXTI_4, EXTI_INTERRUPT, EXTI_TRIG_RISING);
    exti_interrupt_flag_clear(EXTI_4);

    while(1) {
    }
}

/*!
    \brief      测试闪烁 LED
    \param[in]  times: LED 闪烁次数
    \param[out] 无
    \retval     无
*/
static void led_flash(uint8_t times)
{
    uint8_t i;
    for(i = 0; i < times; i++) {
    /* 延时 500 毫秒 */
    delay_1ms(500);
    /* 点亮 LED2 */
    gpio_bit_set(GPIOD, GPIO_PIN_1);

    /* 延时 500 毫秒 */
    delay_1ms(500);
    /* 熄灭 LED2 */
    gpio_bit_reset(GPIOD, GPIO_PIN_1);
    }
}
